ããã³ããšã³ãWebéçºã«ãããé«åºŠãªæ©èœæ€åºãšããã€ã¹æ©èœçºèŠã®ããã«WebHID APIãæŽ»çšããããã®å æ¬çãªã¬ã€ããç¹å®ã®ããŒããŠã§ã¢æ©èœãç¹å®ã»æŽ»çšãããŠãŒã¶ãŒäœéšãåäžãããæ¹æ³ãåŠã³ãŸãã
ããã³ããšã³ãWebHIDã®æ©èœæ€åºïŒããã€ã¹æ©èœã®çºèŠã極ãã
WebHID APIã¯ãWebã¢ããªã±ãŒã·ã§ã³ãå€çš®å€æ§ãªãã¥ãŒãã³ã€ã³ã¿ãŒãã§ãŒã¹ããã€ã¹ïŒHIDïŒãšçŽæ¥å¯Ÿè©±ããããã®åºæ¿çãªå¯èœæ§ãéããŸããåºæ¬çãªéä¿¡ã¯ç°¡åã§ããããã®ããã³ã·ã£ã«ãçã«åŒãåºãéµã¯ãããã€ã¹ã®æ©èœã广çã«æ€åºããããšã«ãããŸãããã®èšäºã§ã¯ãWebHIDã䜿çšããæ©èœæ€åºã«é¢ããå æ¬çãªã¬ã€ããæäŸããããè±ãã§ãå¿çæ§ãé«ããã«ã¹ã¿ãã€ãºãããWebäœéšãæ§ç¯ã§ããããã«ããŸãã
WebHIDãšã¯äœãããããŠãªãæ©èœæ€åºãéèŠãªã®ãïŒ
WebHIDã¯ããŠã§ããµã€ããHIDããã€ã¹ã«ã¢ã¯ã»ã¹ã§ããããã«ããWeb APIã§ããHIDããã€ã¹ã«ã¯ãããŒããŒããããŠã¹ãããã²ãŒã ã³ã³ãããŒã©ãŒãã»ã³ãµãŒãã«ã¹ã¿ã ããŒããŠã§ã¢ãŸã§ããããããã®ãå«ãŸããŸããæšæºåãããã€ã³ã¿ãŒãã§ãŒã¹ã«äŸåããåŸæ¥ã®Web APIãšã¯ç°ãªããWebHIDã¯ããã€ã¹ã®çããŒã¿ãšå¶åŸ¡ã¡ã«ããºã ãžã®çŽæ¥ã¢ã¯ã»ã¹ãæäŸããŸãã
ãããã課é¡ã¯ãHIDããã€ã¹ãéåžžã«å€æ§ã§ããããšã§ããããã¡ãŒã«ãŒã®ã²ãŒã ãããã¯ãå¥ã®ã¡ãŒã«ãŒã®ãã®ãšæ¯èŒããŠãç°ãªããã¿ã³ã軞ããŸãã¯ã»ã³ãµãŒãå ¬éãããããããŸãããã«ã¹ã¿ã ã®ç£æ¥çšã»ã³ãµãŒã«ã¯ãç¬èªã®ããŒã¿åœ¢åŒãèšå®ãªãã·ã§ã³ããããããããŸãããæ©èœæ€åºã®ããã®å ç¢ãªæ¹æ³ããªããã°ãWebã¢ããªã±ãŒã·ã§ã³ã¯ä»®å®ã«é ŒããããåŸãªããªããäºææ§ã®åé¡ãæ©èœã®å¶éããããŠè²§åŒ±ãªãŠãŒã¶ãŒäœéšã«ã€ãªãããŸãã
æ©èœæ€åºãšã¯ãæ¥ç¶ãããHIDããã€ã¹ã®èœåãšæ©èœãããã°ã©ã çã«èå¥ããããã»ã¹ã§ããããã«ãããWebã¢ããªã±ãŒã·ã§ã³ã¯äœ¿çšãããŠããç¹å®ã®ããã€ã¹ã«åºã¥ããŠããã®åäœãšãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãåçã«é©å¿ãããããšãã§ããŸããããã«ãããæé©ãªããã©ãŒãã³ã¹ãäºææ§ããããŠåãŠãŒã¶ãŒã«åãããäœéšãä¿èšŒãããŸãã
HIDã¬ããŒããšãã£ã¹ã¯ãªãã¿ã®çè§£
ã³ãŒãã«é£ã³èŸŒãåã«ãHIDã¬ããŒããšãã£ã¹ã¯ãªãã¿ã®åºæ¬æŠå¿µãçè§£ããããšãéèŠã§ãããããã¯ãããã€ã¹ããã¹ãã·ã¹ãã ãšã©ã®ããã«éä¿¡ããããå®çŸ©ããéèŠãªèŠçŽ ã§ãã
HIDã¬ããŒã
HIDã¬ããŒããšã¯ãããã€ã¹ããã¹ãã«éä¿¡ãããããã¹ãããåä¿¡ãããããããŒã¿ã®ãã±ããã§ããäž»ã«3çš®é¡ã®ã¬ããŒãããããŸãïŒ
- ã€ã³ãããã¬ããŒãïŒããŒã¿ãããã€ã¹ãããã¹ããžéä¿¡ãããïŒäŸïŒãã¿ã³æŒäžãã»ã³ãµãŒã®èªã¿åãå€ïŒã
- ã¢ãŠããããã¬ããŒãïŒããŒã¿ããã¹ãããããã€ã¹ãžéä¿¡ãããïŒäŸïŒLEDã®è²ã®èšå®ãã¢ãŒã¿ãŒé床ã®å¶åŸ¡ïŒã
- ãã£ãŒãã£ãŒã¬ããŒãïŒããã€ã¹ã®æ©èœã®åãåãããèšå®ã«äœ¿çšãããïŒäŸïŒãã¡ãŒã ãŠã§ã¢ããŒãžã§ã³ã®ååŸãæåºŠã¬ãã«ã®èšå®ïŒã
HIDãã£ã¹ã¯ãªãã¿
HIDãã£ã¹ã¯ãªãã¿ã¯ãããã€ã¹ã®èœåãèšè¿°ãããã€ããªæ§é ã§ããã以äžãå«ã¿ãŸãïŒ
- ãµããŒãããã¬ããŒãã®çš®é¡ïŒã€ã³ããããã¢ãŠããããããã£ãŒãã£ãŒïŒã
- åã¬ããŒãå ã®ããŒã¿ã®åœ¢åŒïŒäŸïŒãµã€ãºãããŒã¿åãããããã£ãŒã«ãïŒã
- åããŒã¿èŠçŽ ã®æå³ïŒäŸïŒãã¿ã³1ãXè»žãæž©åºŠã»ã³ãµãŒïŒã
ãã£ã¹ã¯ãªãã¿ã¯ãæ¬è³ªçã«ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒãããŠãã²ããŠã¯Webã¢ããªã±ãŒã·ã§ã³ïŒã«ãããã€ã¹ããéä¿¡ãããããŒã¿ãã©ã®ããã«è§£éããããäŒããèšèšå³ã§ãããã®ãã£ã¹ã¯ãªãã¿ã«ã¢ã¯ã»ã¹ããŠè§£æããããšããWebHIDã«ãããæ©èœæ€åºã®åºç€ãšãªããŸãã
WebHIDã«ããæ©èœæ€åºã®æ¹æ³
WebHIDã«ããæ©èœæ€åºã«ã¯ããã€ãã®ã¢ãããŒãããããããããã«é·æãšçæããããŸãïŒ
- æåã§ã®ãã£ã¹ã¯ãªãã¿è§£æïŒæãçŽæ¥çã§ãããæãè€éãªæ¹æ³ã§ããçã®HIDãã£ã¹ã¯ãªãã¿ãååŸããHID仿§ã«åºã¥ããŠãã®æ§é ãæåã§è§£éããããšãå«ãŸããŸãã
- HIDã¬ããŒãIDã®äœ¿çšïŒå€ãã®ããã€ã¹ã¯ãç°ãªãçš®é¡ã®ã¬ããŒããåºå¥ããããã«ã¬ããŒãIDã䜿çšããŸããç¹å®ã®IDãæã€ãã£ãŒãã£ãŒã¬ããŒããªã¯ãšã¹ããéä¿¡ããããšã§ãããã€ã¹ããã®æ©èœããµããŒãããŠãããã©ããã倿ã§ããŸãã
- ãã³ããŒå®çŸ©ã®Usage PageãšUsageïŒHIDããã€ã¹ã¯ããã³ããŒåºæã®æ©èœã衚ãããã«ã«ã¹ã¿ã ã®Usage PageãšUsageãå®çŸ©ã§ããŸãããããã®å€ãç §äŒããããšã§ãç¹å®ã®æ©èœã®ååšãèå¥ã§ããŸãã
- äºåå®çŸ©ãããæ©èœã»ãããŸãã¯ããŒã¿ããŒã¹ïŒãã³ããŒIDããããã¯ãIDããŸãã¯ãã®ä»ã®èå¥åã«åºã¥ããŠãæ¢ç¥ã®ããã€ã¹æ©èœã®ããŒã¿ããŒã¹ãç¶æããŸããããã«ãããäžè¬çãªããã€ã¹ã®æ©èœãè¿ éãã€ç°¡åã«æ€åºã§ããŸãã
1. æåã§ã®ãã£ã¹ã¯ãªãã¿è§£æïŒè©³çŽ°è§£èª¬
æåã§ã®ãã£ã¹ã¯ãªãã¿è§£æã¯ãæ©èœæ€åºã«å¯ŸããŠæã詳现ãªå¶åŸ¡ãæäŸããŸããããã«ã¯ä»¥äžã®ã¹ããããå«ãŸããŸãïŒ
- ããã€ã¹ã¢ã¯ã»ã¹èŠæ±ïŒ
navigator.hid.requestDevice()ã䜿çšããŠããŠãŒã¶ãŒã«HIDããã€ã¹ãéžæããããä¿ããŸãã - ããã€ã¹ãéãïŒ
device.open()ãåŒã³åºããŠæ¥ç¶ã確ç«ããŸãã - HIDãã£ã¹ã¯ãªãã¿ã®ååŸïŒæ®å¿µãªãããWebHID APIã¯çã®HIDãã£ã¹ã¯ãªãã¿ãçŽæ¥å
¬éããŠããŸãããããã¯å€§ããªå¶éã§ããäžè¬çãªåé¿çã¯ãããã€ã¹ããµããŒãããŠããå Žåã
device.controlTransferIn()ãä»ããŠãGet Descriptorãå¶åŸ¡è»¢éãªã¯ãšã¹ããéä¿¡ããããšã§ããããããããã¯æ®éçã«ãµããŒããããŠããããã§ã¯ãããŸããããã®ãããéåžžã¯ä»ã®æ¹æ³ã®æ¹ãä¿¡é Œæ§ãé«ãã§ãã - ãã£ã¹ã¯ãªãã¿ã®è§£æïŒãã£ã¹ã¯ãªãã¿ãå ¥æã§ãããïŒå ¥æã§ããã°ã®è©±ã§ããïŒïŒãHID仿§ã«åŸã£ãŠãããè§£æããå¿ èŠããããŸããããã«ã¯ããã€ããªããŒã¿ããã³ãŒãããã¬ããŒãã®çš®é¡ãããŒã¿ãµã€ãºãUsageããã®ä»ã®é¢é£è©³çްã«é¢ããæ å ±ãæœåºããããšãå«ãŸããŸãã
äŸïŒå³è§£çšãçŽæ¥ã®ãã£ã¹ã¯ãªãã¿ã¢ã¯ã»ã¹ã¯å¶éãããŠããããïŒïŒ
ãã®äŸã§ã¯ãåé¿çãå€éšã©ã€ãã©ãªãªã©ãéããŠãã£ã¹ã¯ãªãã¿ãååŸããæ¹æ³ãããããšãåæãšããŠããŸãããããé£ããéšåã§ãã
asynce function getDeviceDescriptor(device) {
// ãããé£é¢ã§ãïŒãã£ã¹ã¯ãªãã¿ã®ååŸã
// å®éã«ã¯ããã®éšåã¯çç¥ãããããä»ã®ã¡ãœããã«çœ®ãæãããããããããšããããããŸãã
// ãã®äŸã¯èª¬æã®ã¿ãç®çãšããŠããŸãã
// ã©ã€ãã©ãªãä»ã®æ¹æ³ã䜿çšããŠãã£ã¹ã¯ãªãã¿ãååŸããããšãæ€èšããŠãã ããã
// ãã£ã¹ã¯ãªãã¿ã®åä¿¡ãã·ãã¥ã¬ãŒãïŒå®éã®ååŸåŠçã«çœ®ãæããŠãã ããïŒ
const descriptor = new Uint8Array([0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x03, 0x15, 0x00, 0x25, 0x01, 0x95, 0x03, 0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x05, 0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95, 0x02, 0x81, 0x06, 0xC0, 0xC0]);
return descriptor;
}
async function analyzeDescriptor(device) {
const descriptor = await getDeviceDescriptor(device);
// ããã¯è§£æã®ç°¡ç¥åãããäŸã§ããå®éã®è§£æã¯ããè€éã§ãã
let offset = 0;
while (offset < descriptor.length) {
const byte = descriptor[offset];
switch (byte) {
case 0x05: // Usage Page
const usagePage = descriptor[offset + 1];
console.log("Usage Page:", usagePage.toString(16));
offset += 2;
break;
case 0x09: // Usage
const usage = descriptor[offset + 1];
console.log("Usage:", usage.toString(16));
offset += 2;
break;
case 0xA1: // Collection
const collectionType = descriptor[offset + 1];
console.log("Collection Type:", collectionType.toString(16));
offset += 2;
break;
// ... ãã®ä»ã®ã¢ã€ãã ã¿ã€ãã®ã±ãŒã¹ ...
default:
console.log("Unknown Item:", byte.toString(16));
offset++;
}
}
}
課é¡ïŒ
- è€éãïŒHIDãã£ã¹ã¯ãªãã¿ã®è§£æã«ã¯ãHID仿§ã«é¢ããæ·±ãçè§£ãå¿ èŠã§ãã
- çŽæ¥ã¢ã¯ã»ã¹ã®å¶éïŒWebHIDã¯HIDãã£ã¹ã¯ãªãã¿ãçŽæ¥æäŸããªãããããã®æ¹æ³ã確å®ã«å®è£ ããããšã¯å°é£ã§ãã
- ãšã©ãŒãçºçããããïŒæåã§ã®è§£æã¯ããã£ã¹ã¯ãªãã¿ã®è€éãªæ§é ã®ããã«ãšã©ãŒãçºçããããã§ãã
䜿çšå Žé¢ïŒ
- æ©èœæ€åºã«å¯ŸããŠæã詳现ãªå¶åŸ¡ãå¿ èŠã§ãHID仿§ãçè§£ããããã«å€å€§ãªåŽåãè²»ããããšãããšããªãå Žåã
- ä»ã®æ¹æ³ã§ã¯å¿ èŠãªç¹å®ã®æ©èœãèå¥ããã®ã«äžååãªå Žåã
2. HIDã¬ããŒãIDã®äœ¿çšïŒã¿ãŒã²ãããçµã£ãæ©èœã¯ãšãª
å€ãã®HIDããã€ã¹ã¯ãç°ãªãçš®é¡ã®ã¬ããŒããåºå¥ããããã«ã¬ããŒãIDãå©çšããŸããç¹å®ã®IDãæã€ãã£ãŒãã£ãŒã¬ããŒããªã¯ãšã¹ããéä¿¡ããããšã§ãããã€ã¹ãç¹å®ã®æ©èœããµããŒãããŠãããã©ããã倿ã§ããŸãããã®æ¹æ³ã¯ãæ©èœãååšããå Žåã«ããã€ã¹ã®ãã¡ãŒã ãŠã§ã¢ãç¹å®ã®å€ãè¿ãããšã«äŸåããŠããŸãã
äŸïŒ
async function checkFeatureSupport(device, reportId, expectedResponse) {
try {
const data = new Uint8Array([reportId]); // ã¬ããŒãIDã§ãªã¯ãšã¹ããæºå
await device.sendFeatureReport(reportId, data);
// ããã€ã¹ããã®æåã瀺ãã€ã³ãããã¬ããŒããåŸ
æ©ããŸãã
device.addEventListener("inputreport", (event) => {
const { data, reportId } = event;
const value = data.getUint8(0); // 1ãã€ãã®å¿çãæ³å®
if(value === expectedResponse){
console.log(`Feature with Report ID ${reportId} is supported.`);
return true;
} else {
console.log(`Feature with Report ID ${reportId} returned unexpected value.`);
return false;
}
});
// ãããã¯ãããã€ã¹ãgetFeatureReportã«å³åº§ã«å¿çããå Žå
// const data = await device.receiveFeatureReport(reportId);
// if (data[0] === expectedResponse) {
// console.log(`Feature with Report ID ${reportId} is supported.`);
// return true;
// } else {
// console.log(`Feature with Report ID ${reportId} is not supported.`);
// return false;
// }
} catch (error) {
console.error(`Error checking feature with Report ID ${reportId}:`, error);
return false; // ãšã©ãŒãçºçããå Žåã¯æ©èœããµããŒããããŠããªããšä»®å®
}
return false;
}
async function detectDeviceFeatures(device) {
// äŸ1ïŒç¹å®ã®LEDå¶åŸ¡æ©èœã確èªïŒæ¶ç©ºã®ã¬ããŒãIDïŒ
const ledControlReportId = 0x01;
const ledControlResponseValue = 0x01; // LEDãµããŒãã瀺ãæåŸ
å€
const hasLedControl = await checkFeatureSupport(device, ledControlReportId, ledControlResponseValue);
if (hasLedControl) {
console.log("Device supports LED control!");
} else {
console.log("Device does not support LED control.");
}
// äŸ2ïŒç¹å®ã®ã»ã³ãµãŒæ©èœã確èªïŒæ¶ç©ºã®ã¬ããŒãIDïŒ
const sensorReportId = 0x02;
const sensorResponseValue = 0x01; // ã»ã³ãµãŒãµããŒãã瀺ãæåŸ
å€
const hasSensor = await checkFeatureSupport(device, sensorReportId, sensorResponseValue);
if (hasSensor) {
console.log("Device has a sensor!");
} else {
console.log("Device does not have a sensor.");
}
}
課é¡ïŒ
- ããã€ã¹åºæã®ç¥èãå¿ èŠïŒæ€åºãããæ©èœã®ç¹å®ã®ã¬ããŒãIDãšæåŸ ãããå¿çãç¥ãå¿ èŠããããŸãããã®æ å ±ã¯éåžžãããã€ã¹ã®ããã¥ã¡ã³ãã仿§æžã«èšèŒãããŠããŸãã
- ãšã©ãŒåŠçïŒããã€ã¹ãå¿çããªãããŸãã¯äºæããªãå€ãè¿ããªã©ã®æœåšçãªãšã©ãŒãåŠçããå¿ èŠããããŸãã
- ããã€ã¹ã®äžè²«æ§ãåæãšããïŒç¹å®ã®ã¬ããŒãIDããåãçš®é¡ã®ç°ãªãããã€ã¹éã§åžžã«åãæ©èœã«å¯Ÿå¿ãããšããä»®å®ã«äŸåããŸãã
䜿çšå Žé¢ïŒ
- å¿ èŠãªã¬ããŒãIDãšæåŸ ãããå¿çãæäŸããããã€ã¹ã®ããã¥ã¡ã³ãã仿§æžã«ã¢ã¯ã»ã¹ã§ããå Žåã
- æšæºã®HID Usageã§ã«ããŒãããŠããªãç¹å®ã®æ©èœãæ€åºããå¿ èŠãããå Žåã
3. ãã³ããŒå®çŸ©ã®Usage PageãšUsageïŒã«ã¹ã¿ã æ©èœã®èå¥
HID仿§ã§ã¯ããã³ããŒããã³ããŒåºæã®æ©èœã衚ãããã«ã«ã¹ã¿ã ã®Usage PageãšUsageãå®çŸ©ããããšãèš±å¯ãããŠããŸããUsage Pageã¯é¢é£ããUsageã®åå空éã§ãããUsageã¯ãã®ããŒãžå ã®ç¹å®ã®æ©èœã屿§ãå®çŸ©ããŸãããããã®ãã³ããŒå®çŸ©ã®å€ãç §äŒããããšã§ãã«ã¹ã¿ã æ©èœã®ååšãèå¥ã§ããŸãã
äŸïŒ
ãã®äŸã¯æŠå¿µã瀺ããã®ã§ããå®éã®å®è£ ã§ã¯ãå©çšå¯èœãªUsageã倿ããããã«ã¬ããŒããã£ã¹ã¯ãªãã¿ãèªãå¿ èŠããããããããŸããã
// ããã¯æŠå¿µçãªå³è§£ã§ããWebHIDã¯çŽæ¥
// 詳现ãªãã£ã¹ã¯ãªãã¿è§£æãªãã«usage page/usageãç
§äŒããã¡ãœãããå
¬éããŠããŸããã
async function checkVendorDefinedFeature(device, vendorId, featureUsagePage, featureUsage) {
// ç°¡ç¥åãããããžã㯠- å°æ¥ã®WebHIDããŒãžã§ã³ã§å©çšå¯èœã«ãªã£ãå Žåã¯å®éã®ã¡ãœããã«çœ®ãæããŠãã ãã
if (device.vendorId === vendorId) {
// usageã®ãã§ãã¯ã¯å
éšçã«å¯èœã§ãããšä»®å®
// if (device.hasUsage(featureUsagePage, featureUsage)) { // æ¶ç©ºã®é¢æ°
// console.log("Device supports vendor-defined feature!");
// return true;
// }
console.log("Cannot directly verify the device supports Vendor-defined feature. Consider other methods.");
} else {
console.log("Device does not match the expected vendor ID.");
}
return false;
}
async function detectVendorFeatures(device) {
// äŸïŒãã³ããŒXYZã«ãã£ãŠå®çŸ©ãããã«ã¹ã¿ã æ©èœã確èªïŒæ¶ç©ºïŒ
const vendorId = 0x1234; // æ¶ç©ºã®ãã³ããŒID
const featureUsagePage = 0xF001; // æ¶ç©ºã®ãã³ããŒå®çŸ©Usage Page
const featureUsage = 0x0001; // æ©èœã®ããã®æ¶ç©ºã®Usage
const hasVendorFeature = await checkVendorDefinedFeature(device, vendorId, featureUsagePage, featureUsage);
// ãã£ãŒãã£ãŒã¬ããŒãã䜿çšãã代æ¿ã¢ãããŒãã®äŸãå®çšã«ã¯ã¬ããŒããã£ã¹ã¯ãªãã¿ã®è§£æãå¿
èŠã
if (hasVendorFeature) {
console.log("Device supports Vendor XYZ's custom feature!");
} else {
console.log("Device does not support Vendor XYZ's custom feature.");
}
}
課é¡ïŒ
- ãã³ããŒã®ããã¥ã¡ã³ããå¿ èŠïŒã«ã¹ã¿ã ã®Usage PageãšUsageã®æå³ãçè§£ããããã«ã¯ããã³ããŒã®ããã¥ã¡ã³ãã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸãã
- æšæºåã®æ¬ åŠïŒãã³ããŒå®çŸ©ã®æ©èœã¯æšæºåãããŠããªããããæ±çšçãªæ©èœæ€åºã³ãŒããäœæããããšãå°é£ã§ãã
- WebHIDã®ãµããŒãã®å¶éïŒçŸåšã®WebHIDå®è£ ã§ã¯ãããé«åºŠãªã¬ããŒããã£ã¹ã¯ãªãã¿è§£æãªãã«Usage PageãšUsageãç §äŒããã¡ãœãããçŽæ¥å ¬éããŠããªãå ŽåããããŸãã
䜿çšå Žé¢ïŒ
- ç¹å®ã®ãã³ããŒã®ããŒããŠã§ã¢ãæ±ã£ãŠããããã®ããã¥ã¡ã³ãã«ã¢ã¯ã»ã¹ã§ããå Žåã
- æšæºã®HID Usageã§ã«ããŒãããŠããªãã«ã¹ã¿ã æ©èœãæ€åºããå¿ èŠãããå Žåã
4. äºåå®çŸ©ãããæ©èœã»ãããŸãã¯ããŒã¿ããŒã¹ïŒããã€ã¹èªèã®ç°¡çŽ å
æ©èœæ€åºã®å®çšçãªã¢ãããŒãã®äžã€ã¯ããã³ããŒIDããããã¯ãIDããŸãã¯ãã®ä»ã®èå¥ç¹æ§ã«åºã¥ããŠãæ¢ç¥ã®ããã€ã¹æ©èœã®ããŒã¿ããŒã¹ãç¶æããããšã§ããããã«ãããWebã¢ããªã±ãŒã·ã§ã³ã¯äžè¬çãªããã€ã¹ãè¿ éã«èå¥ããäºåå®çŸ©ãããæ§æãæ©èœã»ãããé©çšã§ããŸãã
äŸïŒ
const deviceDatabase = {
"046d:c52b": { // Logitech G502 ã²ãŒãã³ã°ããŠã¹ (ãã³ããŒID:ãããã¯ãID)
features: {
dpiAdjustment: true,
programmableButtons: 11,
rgbLighting: true
}
},
"04f3:0c4b": { // Elgato Stream Deck (ãã³ããŒID:ãããã¯ãID)
features: {
lcdButtons: true,
customIcons: true,
hotkeys: true
}
}
// ... ä»ã®ããã€ã¹å®çŸ© ...
};
async function detectDeviceFeaturesFromDatabase(device) {
const deviceId = `${device.vendorId.toString(16)}:${device.productId.toString(16)}`;
if (deviceDatabase[deviceId]) {
const features = deviceDatabase[deviceId].features;
console.log("Device found in database!");
console.log("Features:", features);
return features;
} else {
console.log("Device not found in database.");
return null; // ããã€ã¹ã¯èªèãããŸãã
}
}
課é¡ïŒ
- ããŒã¿ããŒã¹ã®ã¡ã³ããã³ã¹ïŒæ°ããããã€ã¹ãæ©èœã§ããŒã¿ããŒã¹ãææ°ã®ç¶æ ã«ä¿ã€ã«ã¯ãç¶ç¶çãªåªåãå¿ èŠã§ãã
- ç¶²çŸ ç¯å²ã®å¶éïŒããŒã¿ããŒã¹ã«ã¯ããã¹ãŠã®å¯èœæ§ã®ããHIDããã€ã¹ãç¹ã«ããŸãäžè¬çã§ãªããã®ãã«ã¹ã¿ã ããŒããŠã§ã¢ã«é¢ããæ å ±ãå«ãŸããŠããªãå ŽåããããŸãã
- äžæ£ç¢ºãã®å¯èœæ§ïŒããŒã¿ããŒã¹å ã®ããã€ã¹æ å ±ãäžå®å šãŸãã¯äžæ£ç¢ºã§ããå¯èœæ§ãããã誀ã£ãæ©èœæ€åºã«ã€ãªããå¯èœæ§ããããŸãã
䜿çšå Žé¢ïŒ
- å¹ åºãäžè¬çãªHIDããã€ã¹ããµããŒãããå¿ èŠãããå Žåã
- ãŠãŒã¶ãŒã«æåã§æ©èœãèšå®ãããããšãªããããã€ã¹ãè¿ éãã€ç°¡åã«æ§æããæ¹æ³ãæäŸãããå Žåã
- ä»ã®æ©èœæ€åºæ¹æ³ã倱æããå Žåã®ãã©ãŒã«ããã¯ã¡ã«ããºã ãšããŠã
WebHIDæ©èœæ€åºã®ãã¹ããã©ã¯ãã£ã¹
- ãŠãŒã¶ãŒã®ãã©ã€ãã·ãŒãåªå ããïŒåžžã«ãŠãŒã¶ãŒã«æç€ºçã«ããã€ã¹ã¢ã¯ã»ã¹ãèŠæ±ãããªã圌ãã®HIDããã€ã¹ãžã®ã¢ã¯ã»ã¹ãå¿ èŠãªã®ããæç¢ºã«èª¬æããŠãã ããã
- ãã©ãŒã«ããã¯ã¡ã«ããºã ãæäŸããïŒæ©èœæ€åºã倱æããå ŽåããŠãŒã¶ãŒãæåã§ããã€ã¹ãæ§æãããããµããŒããããŠããæ©èœã®ãªã¹ãããéžæãããããæ¹æ³ãæäŸããŠãã ããã
- ãšã©ãŒãé©åã«åŠçããïŒäºæããªãåäœãã¯ã©ãã·ã¥ãé²ãããã«ãå ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŠãã ããã
- éåææäœã䜿çšããïŒWebHIDã®æäœã¯éåæã§ãããããã¡ã€ã³ã¹ã¬ããããããã¯ããªãããã«
asyncãšawaitãå¿ ã䜿çšããŠãã ããã - ããã©ãŒãã³ã¹ãæé©åããïŒããã©ãŒãã³ã¹ãåäžãããããããªãŒæ¶è²»ãåæžããããã«ãæ©èœæ€åºãªã¯ãšã¹ãã®æ°ãæå°éã«æããŠãã ããã
- å€éšã©ã€ãã©ãªãæ€èšããïŒWebHIDæ©èœæ€åºã®ããã®é«ã¬ãã«ã®æœè±¡åãæäŸããå€éšã©ã€ãã©ãªãã¢ãžã¥ãŒã«ã®äœ¿çšãæ€èšããŠãã ããã
- 培åºçã«ãã¹ãããïŒäºææ§ãšæ£ç¢ºæ§ã確ä¿ããããã«ãããŸããŸãªHIDããã€ã¹ã§ã³ãŒãããã¹ãããŠãã ããããã¹ãããã»ã¹ãå¹çåããããã«ãèªåãã¹ããã¬ãŒã ã¯ãŒã¯ã®äœ¿çšãæ€èšããŠãã ããã
å®äžçã®äŸãšãŠãŒã¹ã±ãŒã¹
- ã²ãŒã ïŒæ€åºããããã¿ã³ã軞ãã»ã³ãµãŒã«åºã¥ããŠã²ãŒã ãããã®ã¬ã€ã¢ãŠããåçã«èª¿æŽããã
- ã¢ã¯ã»ã·ããªãã£ïŒä»£æ¿ããŒããŒãããã€ã³ãã£ã³ã°ããã€ã¹ãªã©ã®æ¯æŽããã€ã¹çšã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãé©å¿ãããã
- ç£æ¥çšå¶åŸ¡ïŒè£œé ãããããå·¥åŠããã®ä»ã®ç£æ¥çšã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããã«ã¹ã¿ã ã»ã³ãµãŒãã¢ã¯ãã¥ãšãŒã¿ãŒãšã®å¯Ÿè©±ãäŸãã°ãWebã¢ããªã±ãŒã·ã§ã³ã¯USB-HIDçµç±ã§æ¥ç¶ãããç¹å®ã®æž©åºŠã»ã³ãµãŒãå§åèšã®ååšãæ€åºã§ããŸãã
- æè²ïŒé»åé¡åŸ®é¡ãããŒã¿åéã·ã¹ãã ãªã©ã®ç¹æ®ãªããŒããŠã§ã¢ãå©çšããã€ã³ã¿ã©ã¯ãã£ããªåŠç¿ããŒã«ãæ§ç¯ããã
- ãã«ã¹ã±ã¢ïŒé 鿣è ã¢ãã¿ãªã³ã°ã®ããã«ããã«ã¹ãªãã·ã¡ãŒã¿ãŒãè¡å§èšãªã©ã®å»çæ©åšã«æ¥ç¶ããã
- ããžã¿ã«ã¢ãŒãïŒçå§æåºŠãåŸãæ€åºãåããããŸããŸãªæç»ã¿ãã¬ãããã¹ã¿ã€ã©ã¹ããµããŒããããäžççãªäŸãšããŠã¯ãäžçäžã®ã¢ãŒãã£ã¹ãã䜿çšããWacomã¿ãã¬ããããµããŒãããçå§ã¬ãã«ããã¿ã³æ§æãæ£ããè§£éããããšãæããããŸãã
çµè«
æ©èœæ€åºã¯ãWebHIDã䜿çšããŠå ç¢ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§éåžžã«éèŠãªåŽé¢ã§ããHIDã¬ããŒãããã£ã¹ã¯ãªãã¿ãããã³ããŸããŸãªæ€åºæ¹æ³ã®æŠå¿µãçè§£ããããšã§ããã®åŒ·åãªAPIã®æœåšèœåãæå€§éã«åŒãåºãããšãã§ããŸããç¹ã«çŽæ¥ã®ãã£ã¹ã¯ãªãã¿ã¢ã¯ã»ã¹ã«ã¯èª²é¡ãååšããŸãããç°ãªãã¢ãããŒããçµã¿åãããå€éšãªãœãŒã¹ã掻çšããããšã§ããã广çã§é©å¿æ§ã®ãããœãªã¥ãŒã·ã§ã³ã«ã€ãªãããŸããWebHIDãé²åãç¶ããã«ã€ããŠãæ©èœæ€åºèœåã®ãããªãåäžãæåŸ ãããå€çš®å€æ§ãªããŒããŠã§ã¢ããã€ã¹ãšã·ãŒã ã¬ã¹ã«å¯Ÿè©±ããé åçãªWebäœéšãããã«ç°¡åã«äœæã§ããããã«ãªãã§ãããã
ãŠãŒã¶ãŒã®ãã©ã€ãã·ãŒãåªå ãããšã©ãŒãé©åã«åŠçãã培åºçã«ãã¹ãããŠããŠãŒã¶ãŒã«ããžãã£ãã§ä¿¡é Œæ§ã®é«ãäœéšãä¿èšŒããããšãå¿ããªãã§ãã ãããWebHIDæ©èœæ€åºã®æè¡ãç¿åŸããããšã§ãããžã¿ã«äžçãšç©çäžçã®éã®ã®ã£ãããåãããçã«é©æ°çã§é åçãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã